﻿// Clases de la FCL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// Clases para sincronización con la base de datos
using MySql.Data;
using MySql.Data.MySqlClient;
// Clases de constrol
using PDS_ANDU.DTO;
using PDS_ANDU.Controles;
using System.Collections;
using PDS_ANDU.Entidades;

namespace PDS_ANDU.DAO
{
    /// <summary>
    /// Esta clase se utiliza para encapsular la comunicación
    /// de la aplicación con la base de datos. Notar que es clase
    /// abstracta y los métodos definidos son de static.
    /// </summary>
    ///
    public abstract class DAO
    {
        /// <summary>
        /// Este método abre una conexión con la base de datos
        /// y devuelve la instancia para que pueda ser manipulada.
        /// </summary>
        /// <returns></returns>
        private static MySqlConnection establecerConexion()
        {
            // Cadena de conexión con el servidor
            //string connStr = "Server=190.228.29.195;User=usuario_pds;Database=db_pds;Password=alejandro;";
            string connStr = "Server=localhost;User=root;Database=pds;Password=;";
            //string connStr = "Server=mysql5.000webhost.com;Database=a7021828_PDS;Uid=a7021828_goti;Pwd=ale079;";

            // Crea una instancia de conexión
            MySqlConnection conn = new MySqlConnection(connStr);

            try
            {
                // Abre la conexión
                conn.Open();

                return conn;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        } // fin del método establecerConexion

        
        /// <summary>
        /// Este método verifica si existe una cuenta de usuario
        /// con los datos que recibe como parámetro, y devuelve un
        /// DTO que indica el tipo de usuario.
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="pass"></param>
        /// <returns>DTOusuario</returns>
        public static DTOusuario getUsuario(string usuario, string pass)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Verificamos primero si es un suscriptor
                string sql = " SELECT usuario, clave" +
                             " FROM suscriptor" +
                             " WHERE usuario='" + usuario + "'" +
                             " AND clave='" + pass + "'";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Si es suscriptor
                if (rdr.Read()) // si existe una coincidencia
                {
                    rdr.Close();
                    // Cierra la conexion
                    conn.Close();
                    return new DTOusuario("suscriptor");
                }
                // cerramos el lector
                rdr.Close();

                // Verificamos si es un editor
                sql = " SELECT usuario, clave" +
                      " FROM editor" +
                      " WHERE usuario='" + usuario + "'" +
                      " AND clave='" + pass + "'";
                
                // Ejecuta la sentencia sql
                cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                rdr = cmd.ExecuteReader();
                // Si es editor
                if (rdr.Read()) // si existe una coincidencia
                {
                    rdr.Close();
                    // Cierra la conexion
                    conn.Close();
                    return new DTOusuario("editor");
                }
                
                // No coincide con ninguna cuenta
                // Cierra la conexion
                conn.Close();
                rdr.Close();
                return new DTOusuario(null);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        } // fin de método getUsuario


        public static List<Deporte> getDeportes()//Obtiene una lista con todos los nombres de los deportes
        {
            try
            {
                List<Deporte> deportes = new List<Deporte>();
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Obtenemos la lista de todos los deportes (los nombres)  
                string sql = " SELECT id_deporte,nombre,deporte.id_categoria" +
                             " FROM categoria,deporte" +
                             " WHERE categoria.id_categoria = deporte.id_categoria" +
                             " ORDER BY nombre ASC";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Leemos todos los resultados
                while (rdr.Read()) 
                {
                    deportes.Add(new Deporte(rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)));
                }
                // cerramos el lector
                rdr.Close();

                return deportes;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        } // fin de método getDeportes

        public static List<Deportista> getDeportistas()//Obtiene una lista con todos los nombres de los deportistas
        {
            try
            {
                List<Deportista> deportistas = new List<Deportista>();
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Obtenemos la lista de todos los deportistas (los nombres y los apellidos)  
                string sql = " SELECT id_deportista,nombre,apellido,deportista.id_categoria" +
                             " FROM categoria,deportista" +
                             " WHERE categoria.id_categoria = deportista.id_categoria" +
                             " ORDER BY apellido ASC";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Leemos todos los resultados
                while (rdr.Read())
                {
                    deportistas.Add(new Deportista(rdr.GetInt32(0), rdr.GetString(1), rdr.GetString(2), rdr.GetInt32(3)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return deportistas;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        } // fin de método getDeportes


        internal static List<Torneo> getTorneos()
        {
            try
            {
                List<Torneo> torneos = new List<Torneo>();
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Obtenemos la lista de todos los torneos (los nombres)  
                string sql = " SELECT id_torneo,nombre,torneo.id_categoria" +
                             " FROM categoria,torneo" +
                             " WHERE categoria.id_categoria = torneo.id_categoria" +
                             " ORDER BY nombre ASC";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Leemos todos los resultados
                while (rdr.Read())
                {
                    torneos.Add(new Torneo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return torneos;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        internal static List<Equipo> getEquipos()
        {
            try
            {
                List<Equipo> equipos = new List<Equipo>();
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Obtenemos la lista de todos los equipos (los nombres)  
                string sql = " SELECT id_equipo,nombre,equipo.id_categoria" +
                             " FROM categoria,equipo" +
                             " WHERE categoria.id_categoria = equipo.id_categoria" +
                             " ORDER BY nombre ASC";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Leemos todos los resultados
                while (rdr.Read())
                {
                    equipos.Add(new Equipo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return equipos;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        internal static List<Noticia> getNoticias()
        {
            try
            {
                List<Noticia> noticias = new List<Noticia>();
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Obtenemos la lista de todas las noticias
                string sql = " SELECT numero,titulo,resumen,enlace" +
                             " FROM noticia" +
                             " ORDER BY numero ASC";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Leemos todos los resultados
                while (rdr.Read())
                {
                    noticias.Add(new Noticia(rdr.GetInt32(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return noticias;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// No sólo deberá persistir la noticia, sino también la lista de
        /// categorias que tiene asociada la misma.
        /// </summary>
        /// <param name="miNoticia"></param>
        public static bool persistirNoticia(Noticia miNoticia)
        {
            string consultaNoticia =
                "INSERT INTO  noticia (" +
                "numero ," +
                "titulo ," +
                "resumen ," +
                "fecha ," +
                "fechaPublicacion ," +
                "enlace" +
                ")" +
                "VALUES (" +
                "NULL ,  '" + miNoticia.Titulo + "',  '" + miNoticia.Resumen + "',  '" + miNoticia.Fecha.ToString("yyyy-MM-dd") + "',  '" + DateTime.Today.ToString("yyyy-MM-dd") + "',  '" + miNoticia.Enlace + "'" +
                ");";

            //Genero la consulta para asociar las categorias con las que se relaciona la 
            //noticia que estoy agregado
            string consultaNoticiaCategoria = "INSERT INTO noticiaCategoria (" +
                "id_noticia ," +
                "id_categoria" +
                ") VALUES (";

            
            foreach (Categoria categoria in miNoticia.Categorias)
                consultaNoticiaCategoria = consultaNoticiaCategoria + "LAST_INSERT_ID(), '" + categoria.Id_categoria + "'), (";

            consultaNoticiaCategoria = consultaNoticiaCategoria.Substring(0, consultaNoticiaCategoria.Length - 3) + ";";

            //Ahora ejecutaremos las consultas generadas
            // Crea una instancia de conexión
            MySqlConnection conn = establecerConexion();
            // Ejecuta la sentencia sql
            MySqlCommand cmd = new MySqlCommand(consultaNoticia + consultaNoticiaCategoria, conn);
            cmd.ExecuteNonQuery();

            conn.Close();

            return true;
            /*
             * INSERT INTO  noticia (
                'numero' ,
                'titulo' ,
                'resumen' ,
                'fecha' ,
                'fechaPublicacion' ,
                'enlace'
                )
                VALUES (
                NULL ,  '',  '',  '2011-12-05',  '2011-12-12',  'http://localhost'
                );
             * */

            /*
             * INSERT INTO `db_pds`.`noticiaCategoria` (
                `id_noticia` ,
                `id_categoria`
                )
                VALUES (
                '3', '4'
                ), (
                '5', '6'
                );
                */
        }

        public static List<Perfil> getPerfiles(string cuenta)
        {
            try 
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                string sql = " SELECT p.numero, p.nombre , s.usuario" +
                             " FROM suscriptor s, perfil p" +
                             " WHERE usuario='" + cuenta + "' AND id_suscriptor= usuario";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();

                List<Perfil> perfiles = new List<Perfil>();
                while (rdr.Read())
                {
                    perfiles.Add(new Perfil((ushort)rdr.GetInt16(0), rdr.GetString(1),new Suscriptor(rdr.GetString(2))));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return perfiles;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static List<Categoria> getCategorias(Notificacion notif)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();


                string sql = " SELECT c.id_categoria, c.nombre" +
                             " FROM categoria c, noticiaCategoria nc" +
                             " WHERE nc.id_noticia='" + notif.Noticia.Numero + "'" +
                             " AND nc.id_categoria=c.id_categoria ";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();

                List<Categoria> categorias = new List<Categoria>();
                while (rdr.Read())
                {
                    categorias.Add(new Categoria(rdr.GetInt32(0), rdr.GetString(1)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return categorias;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Este metodo obtiene las categorias asociadas al perfil pasado como parámetro
        /// </summary>
        /// <param name="perfil"></param>
        /// <returns></returns>
        public static List<Categoria> getCategoriasPerfil(Perfil perfil)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();


                string sql = " SELECT c.id_categoria, c.nombre" +
                             " FROM categoria c, perfilcategoria pc" +
                             " WHERE pc.id_perfil='" + perfil.Numero + "'" +
                             " AND pc.id_categoria=c.id_categoria ";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();

                List<Categoria> categorias = new List<Categoria>();
                while (rdr.Read())
                {
                    categorias.Add(new Categoria(rdr.GetInt32(0), rdr.GetString(1)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return categorias;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Este metodo obtiene las categorias asociadas al perfil pasado como parámetro
        /// </summary>
        /// <param name="perfil"></param>
        /// <returns></returns>
        public static List<Categoria> getCategoriasPerfil(string nombrePerfil)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();


                string sql = " SELECT c.id_categoria, c.nombre" +
                             " FROM categoria c, perfilcategoria pc, perfil p" +
                             " WHERE p.nombre='" + nombrePerfil + "'" +
                             " AND pc.id_categoria=c.id_categoria AND p.numero = pc.id_perfil";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();

                List<Categoria> categorias = new List<Categoria>();
                while (rdr.Read())
                {
                    categorias.Add(new Categoria(rdr.GetInt32(0), rdr.GetString(1)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return categorias;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /*
        public static List<Notificacion> obtenerNotificaciones(string user)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                
                string sql = " SELECT DISTINCT n.numero, n.titulo , n.resumen, n.fecha, n.fechaPublicacion, n.enlace" +
                             " FROM noticia n, noticiaCategoria nc, perfilcategoria pf, perfil p" +
                             " WHERE p.id_suscriptor='" + user + "'AND n.numero=nc.id_noticia" +
                             " AND nc.id_categoria=pf.id_categoria AND pf.id_perfil=p.numero";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();

                List<Notificacion> notificaciones = new List<Notificacion>();
                while (rdr.Read())
                {
                    notificaciones.Add(new Notificacion(new Noticia(rdr.GetInt32(0), rdr.GetString(1), rdr.GetString(2), rdr.GetDateTime(3), rdr.GetDateTime(4), rdr.GetString(5))));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return notificaciones;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }*/

        public static List<DTONotificacion> obtenerNotificaciones(string user)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();


                string sql = " SELECT DISTINCT n.numero, n.titulo , n.resumen, n.fecha, n.fechaPublicacion, n.enlace, p.nombre" +
                             " FROM noticia n, noticiaCategoria nc, perfilcategoria pf, perfil p" +
                             " WHERE p.id_suscriptor='" + user + "'AND n.numero=nc.id_noticia" +
                             " AND nc.id_categoria=pf.id_categoria AND pf.id_perfil=p.numero";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();

                List<DTONotificacion> notificaciones = new List<DTONotificacion>();
                while (rdr.Read())
                {
                    notificaciones.Add(new DTONotificacion(rdr.GetInt32(0),new Perfil(0,rdr.GetString(6),null),rdr.GetString(1),rdr.GetString(2),rdr.GetString(5)));
                }
                // cerramos el lector
                rdr.Close();
                conn.Close();
                return notificaciones;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        /// <summary>
        /// Persiste un nuevo perfil en la base de datos.
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="nombrePerfil"></param>
        /// <param name="deportes"></param>
        /// <param name="torneos"></param>
        /// <param name="equipos"></param>
        /// <param name="deportistas"></param>
        public static void persistirPerfil(Perfil perfil)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();
                string sql;

                // Insertamos los valores del nuevo perfil
                sql = " INSERT INTO perfil(nombre, id_suscriptor)" +
                      " VALUES('" + perfil.Nombre + "', '" + perfil.Suscriptor.Usuario + "');" +
                      " SELECT LAST_INSERT_ID( );";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // Obtiene el id del perfil insertado
                rdr.Read();
                int idPerfil = rdr.GetInt32(0);
                rdr.Close();

                // Ahora insertamos los valores para las categorias asociadas al perfil
                sql = " INSERT INTO perfilcategoria(id_perfil, id_categoria)" +
                      " VALUES";
                // Primero insertamos los deportes
                for (int i = 0; i < perfil.Categorias.Count; i++)
                {
                    // para la primer entrada se sigue un formato sin coma inicial
                    if (i == 0)
                    {
                        sql += " ('" + idPerfil + "', '" + perfil.Categorias[i].Id_categoria + "')";
                    }
                    else
                    {
                        sql += ", ('" + idPerfil + "', '" + perfil.Categorias[i].Id_categoria + "')";
                    }
                }

                cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        } // fin del método persistirPerfil

        /// <summary>
        /// Verifica si el usuario tiene un perfil con el nombre especificado.
        /// </summary>
        /// <param name="nombreUsuario"></param>
        /// <param name="nombrePerfil"></param>
        /// <returns></returns>
        public static bool existePerfil(string nombreUsuario, string nombrePerfil)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();
                // variable de control
                bool encontrado = false;

                // Verificamos primero si es un suscriptor
                string sql = " SELECT *" +
                             " FROM perfil" +
                             " WHERE nombre='" + nombrePerfil + "'" +
                             " AND id_suscriptor='" + nombreUsuario + "'";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // si encontró el perfil
                if (rdr.Read())
                {
                    encontrado = true;
                }

                // cerramos el lector
                rdr.Close();
                // cerramos la conexión
                conn.Close();

                return encontrado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        } // fin del método existePerfil

        /// <summary>
        /// Devuelve los perfiles del usuario con el nombre especificado.
        /// </summary>
        /// <param name="nombreUsuario"></param>
        public static List<Perfil> obtenerPerfiles(string nombreUsuario)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Verificamos primero si es un suscriptor
                string sql = " SELECT *" +
                             " FROM perfil" +
                             " WHERE id_suscriptor='" + nombreUsuario + "'";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                
                // crea los perfiles
                List<Perfil> perfiles = new List<Perfil>();
                while (rdr.Read())
                {
                    // obtiene los datos principales del perfil
                    ushort numeroPerfil = (ushort)rdr.GetInt16(0);
                    string nombrePerfil = rdr.GetString(1);
                    string idSuscriptor = rdr.GetString(2);
                    List<Categoria> categorias = new List<Categoria>();
                    Suscriptor suscriptor = new Suscriptor(idSuscriptor);
                    Perfil nuevo;

                    // Crea una instancia de conexión
                    MySqlConnection conn2 = establecerConexion();

                    // obtiene las categorias asociadas al perfil
                    sql = " SELECT *" +
                          " FROM perfilcategoria" +
                          " WHERE id_perfil='" + numeroPerfil + "'";

                    // Ejecuta la sentencia sql
                    cmd = new MySqlCommand(sql, conn2);
                    // Lector de resultado
                    MySqlDataReader rdr2 = cmd.ExecuteReader();

                    // crea las categorias
                    while(rdr2.Read())
                    {
                        // número de categoria
                        int idCategoria = rdr2.GetInt32(1);

                        // Crea una instancia de conexión
                        MySqlConnection conn3 = establecerConexion();

                        sql = " SELECT *" +
                              " FROM categoria" +
                              " WHERE id_categoria='" + idCategoria + "'";

                        // Ejecuta la sentencia sql
                        cmd = new MySqlCommand(sql, conn3);
                        // Lector de resultado
                        MySqlDataReader rdr3 = cmd.ExecuteReader();
                        // obtiene el nombre de categoria
                        rdr3.Read();
                        string nombreCategoria = rdr3.GetString(1);
                        rdr3.Close();

                        // verifica que la categoria no sea un deportista
                        sql = " SELECT *" +
                              " FROM deportista" +
                              " WHERE id_categoria='" + idCategoria + "'";

                        // Ejecuta la sentencia sql
                        cmd = new MySqlCommand(sql, conn3);
                        // Lector de resultado
                        MySqlDataReader rdr4 = cmd.ExecuteReader();
                        // si encontró un deportista
                        if (rdr4.Read())
                        {
                            /// modifica el nombre de categoria para que tenga
                            /// el apellido si es un deportista
                            nombreCategoria += " " + rdr4.GetString(1);
                        }
                        rdr4.Close();
                        conn3.Close();
                        // crea una nueva categoria
                        Categoria nueva = new Categoria(idCategoria, nombreCategoria);
                        // agrega la categoria a la lista
                        categorias.Add(nueva);
                    }
                    // crea el nuevo perfil
                    nuevo = new Perfil(numeroPerfil, nombrePerfil, suscriptor, categorias);
                    // agrega el perfil a la lista de perfiles de usuario
                    perfiles.Add(nuevo);

                    rdr2.Close();
                    conn2.Close();
                }

                // cerramos el lector
                rdr.Close();
                // cerramos la conexión
                conn.Close();
                // devuelve los perfiles
                return perfiles;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        } // fin del método obtenerPerfiles


        public static void registrarUsuario(string usuario, string clave, string nombre, string apellido, string email, char sexo, DateTime fechaNacimiento, Ciudad ciudad, Provincia provincia, Pais pais)
        { 
            string consultaUsuario = "INSERT INTO  suscriptor (" +
                                                    "usuario ," +
                                                    "clave ," +
                                                    "nombre ," +
                                                    "apellido ," +
                                                    "email ," +
                                                    "sexo ," +
                                                    "fechaNacimiento ," +
                                                    "ciudad ," +
                                                    "provincia ," +
                                                    "pais" +
                                                    ")" +
                                                    "VALUES (" +
                                                    "'" + usuario + "',  '" + clave + "',  '" + nombre + "',  '" + apellido + "',  '" + email + "',  '" + sexo + "',  '" + fechaNacimiento.ToString("yyyy-MM-dd") + "',  '" + ciudad.Nombre + "',  '" + provincia.Nombre + "',  '" + pais.Nombre + "'" +
                                                    ");";
            
            // Crea una instancia de conexión
            MySqlConnection conn = establecerConexion();

            MySqlCommand cmd = new MySqlCommand(consultaUsuario, conn);

            cmd.ExecuteNonQuery();

            conn.Close();
        }

        /// <summary>
        /// Método que retornará una publicidad (al azar) que esté relacionada con alguna 
        /// (tambien al azar) de las categorias pasadas como argumento
        /// </summary>
        /// <param name="categorias"></param>
        /// <returns></returns>
        public static Publicidad obtenerAnuncio(List<Categoria> categorias) 
        {
            Random objetoCategoria = new Random(DateTime.Now.Millisecond);
            int numeroCategoria = objetoCategoria.Next(0, categorias.Count);
            Categoria categoriaElegidaAlAzar = categorias[numeroCategoria];

            List<Publicidad> publicidadesRelacionadas = new List<Publicidad>();
            publicidadesRelacionadas = DAO.obtenerPublicidadesRelacionadasConCategoria(categoriaElegidaAlAzar.Id_categoria);

            if (publicidadesRelacionadas.Count == 0)
                return null;

            Random objetoPublicidad = new Random(DateTime.Now.Millisecond);
            int numeroPublicidad = objetoPublicidad.Next(0, publicidadesRelacionadas.Count);
            Publicidad publicidadElegidaAlAzar = publicidadesRelacionadas[numeroPublicidad];


            return publicidadElegidaAlAzar;
        }

        private static List<Publicidad> obtenerPublicidadesRelacionadasConCategoria(int id_cat)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();
                // variable de control
                List<Publicidad> publicidadesEncontradas = new List<Publicidad>();

                // Verificamos primero si es un suscriptor
                string sql = " SELECT publicidad.id_publicidad, titulo, descripcion, enlace, id_anunciante" +
                             " FROM publicidad, publicidadcategoria" +
                             " WHERE publicidad.id_publicidad = publicidadcategoria.id_publicidad" +
                             " AND id_categoria ='" + id_cat + "'";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                // si encontró el perfil
                while (rdr.Read())
                {
                    publicidadesEncontradas.Add(new Publicidad(rdr.GetInt32(0),rdr.GetString(1),rdr.GetString(2),rdr.GetString(3),rdr.GetString(4)));
                }

                // cerramos el lector
                rdr.Close();
                // cerramos la conexión
                conn.Close();

                return publicidadesEncontradas;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static void registrarAccesoRegistro(int id_perfil, int id_publicidad)
        {
            string consulta = "INSERT INTO  registroacceso (" +
                                        "id_publicidad ," +
                                        "id_perfil ," +
                                        "fecha" +
                                        ")" +
                                        "VALUES (" +
                                        "'" + id_publicidad + "',  '" + id_perfil + "',  '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'" +
                                        ");";

            // Crea una instancia de conexión
            MySqlConnection conn = establecerConexion();

            MySqlCommand cmd = new MySqlCommand(consulta, conn);

            cmd.ExecuteNonQuery();

            conn.Close();
        }

        /// <summary>
        /// Devuelve el identificador de perfil a partir de su nombre.
        /// </summary>
        /// <param name="nombrePerfil"></param>
        /// <returns></returns>
        public static int obtenerIdPerfil(string nombrePerfil)
        {
            try
            {
                // Crea una instancia de conexión
                MySqlConnection conn = establecerConexion();

                // Verificamos primero si es un suscriptor
                string sql = " SELECT numero" +
                             " FROM perfil" +
                             " WHERE nombre='" + nombrePerfil + "';";

                // Ejecuta la sentencia sql
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                // Lector de resultado
                MySqlDataReader rdr = cmd.ExecuteReader();
                rdr.Read();

                int resultado = rdr.GetInt32(0);

                // cerramos el lector
                rdr.Close();
                // cerramos la conexión
                conn.Close();
                // devolvemos el id de perfil
                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        } // fin del método obtenerIdPerfil

    } // fin de clase DAO
}
